/*
 *  Copyright 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

/**
 * Description of media constraints for {@code MediaStream} and
 * {@code PeerConnection}.
 */
public class MediaConstraints {
    /**
     * Simple String key/value pair.
     */
    public static class KeyValuePair {
        private final String key;
        private final String value;

        public KeyValuePair(String key, String value) {
            this.key = key;
            this.value = value;
        }

        @CalledByNative("KeyValuePair")
        public String getKey() {
            return key;
        }

        @CalledByNative("KeyValuePair")
        public String getValue() {
            return value;
        }

        @Override
        public String toString() {
            return key + ": " + value;
        }

        @Override
        public boolean equals(@Nullable Object other) {
            if (this == other) {
                return true;
            }
            if (other == null || getClass() != other.getClass()) {
                return false;
            }
            KeyValuePair that = (KeyValuePair) other;
            return key.equals(that.key) && value.equals(that.value);
        }

        @Override
        public int hashCode() {
            return key.hashCode() + value.hashCode();
        }
    }

    public final List<KeyValuePair> mandatory;
    public final List<KeyValuePair> optional;

    public MediaConstraints() {
        mandatory = new ArrayList<KeyValuePair>();
        optional = new ArrayList<KeyValuePair>();
    }

    private static String stringifyKeyValuePairList(List<KeyValuePair> list) {
        StringBuilder builder = new StringBuilder("[");
        for (KeyValuePair pair : list) {
            if (builder.length() > 1) {
                builder.append(", ");
            }
            builder.append(pair.toString());
        }
        return builder.append("]").toString();
    }

    @Override
    public String toString() {
        return "mandatory: " + stringifyKeyValuePairList(mandatory) + ", optional: "
                + stringifyKeyValuePairList(optional);
    }

    @CalledByNative
    List<KeyValuePair> getMandatory() {
        return mandatory;
    }

    @CalledByNative
    List<KeyValuePair> getOptional() {
        return optional;
    }
}
